﻿#define _CRT_SECURE_NO_WARNINGS

//#include <stdio.h>
//
//int add(int a, int b)
//{
//	return a + b;
//}
//int sub(int a, int b)
//{
//	return a - b;
//}
//int mul(int a, int b)
//{
//	return a * b;
//}
//int div(int a, int b)
//{
//	return a / b;
//}
//
//void menu()
//{
//	printf("*************************\n");
//	printf(" 1:add              2:sub \n");
//	printf(" 3:mul              4:div \n");
//	printf("          0:exit \n");
//	printf("*************************\n\n");
//	printf("请选择：");
//}
//
//void test(int (*p)(int,int))
//{
//	int x, y;
//	printf("请输入两个整数：");
//	scanf("%d %d", &x, &y);
//	printf("\n");
//	int ret = p(x, y);
//	printf("ret = %d\n\n", ret);
//}
//
//int main()
//{
//	int input = 0;
//	int ret = 0;
//	do
//	{
//		menu();
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 0:
//			printf("已退出计算器！");
//			break;
//		case 1:
//			test(add);
//			break;
//		case 2:
//			test(sub);
//			break;
//		case 3:
//			test(mul);
//			break;
//		case 4:
//			test(div);
//			break;
//		}
//			} while (input);
//			return 0;
//}

//#include <stdio.h>
//#include <stdlib.h>
//
//int cmp_int(const void* e1,const void* e2)
//{
//	return *(int*)e2 - *(int*)e1;
//}
//
//int main()
//{
//	int arr[] = { 4,6,2,7,1,8,3,5,10,9 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, sz, sizeof(int), cmp_int);
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}

#include <stdio.h>
#include <stdlib.h>

//cmp_int(const void* e1, const void* e2)
//{
//	return *(int*) e2 - *(int*) e1;
//}
//int main()
//{
//	int arr[] = { 5,3,6,2,7,1,4,10,9,8 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, sz, sizeof(arr[0]), cmp_int);
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}
//
//#include <string.h>
//
//struct stu
//{
//	//姓名
//	char name[20];
//	//年龄
//	int age;
//};
//
//int cmp_stu_by_name(const void* e1, const void* e2)
//{
//	return ((*(struct stu*)e1).name , (*(struct stu*)e2).name);
//}
//
//int main()
//{
//	struct stu s[3] = { {"zhangsan",13},{"lisi",18},{"wangwu",23} };
//	int sz = sizeof(s) / sizeof(s[0]);
//	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
//	return 0;
//}

//
//struct stu
//{
//	int n;
//	int arr[];
//};
//
//int main()
//{
//	struct stu* ps=(struct stu*)malloc(sizeof(struct stu) + 20);
//	if (ps == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	ps->n = 100;
//	for (int i = 0; i < 5; i++)
//	{
//		ps->arr[i] = i;
//	}
//	struct stu* ptr=realloc(ps, sizeof(struct stu) + 40);
//	if (ptr == NULL)
//	{
//		perror("realloc");
//		return 1;
//	}
//	else
//	{
//		ps = ptr;
//	}
//	for (int i = 5; i < 10; i++)
//	{
//		ps->arr[i] = i;
//	}
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ", ps->arr[i]);
//	}
//  free(ps);
//  ps=NULL;
//	return 0;
//}

//struct stu
//{
//	int n;
//	int* arr;
//};
//
//int main()
//{
//	struct stu* ps=(struct stu*)malloc(sizeof(struct stu));
//	if (ps == NULL)
//	{
//		perror("malloc1");
//		return 1;
//	}
//	ps->n = 100;
//	ps->arr=(int*)malloc(20);
//	if (ps->arr == NULL)
//	{
//		perror("malloc2");
//		return 0;
//	}
//	for (int i = 0; i < 5; i++)
//	{
//		ps->arr[i] = i;
//	}
//	int* ptr=(int*)realloc(ps->arr, 40);
//	if (ptr == NULL)
//	{
//		perror("realloc");
//		return 1;
//	}
//	else
//	{
//		ps->arr = ptr;
//	}
//	for (int i = 5; i < 10; i++)
//	{
//		ps->arr[i] = i;
//	}
//	for (int i = 0; i < 10; i++)
//	{
//	    printf("%d ", ps->arr[i]);
//	}
//	free(ps->arr);
//	ps->arr = NULL;
//	free(ps);
//	ps = NULL;
//	return 0;
//}

//模拟实现qsort

//void exg(char* p1, char* p2, int size)
//{
//	int i = 0;
//	for (i =0;i < size; i++)
//	{
//		char exg = *(p1+i);
//		*(p1 + i) = *(p2 + i);
//		*(p2 + i) = exg;
//	}
//}
//
//void my_qsort(void* arr, int num, int size, int (*compar)(const void*,const void*))
//{
//	int i = 0;
//	int j = 0;
//	char* p = arr;
//	for (i = 0; i < num - 1; i++)
//	{
//		for (j = 0; j < num - i - 1; j++)
//		{
//			if (compar(p+size*j, p+size*(j+1)) > 0)
//			{
//				exg(p + size * j, p + size * (j + 1), size);
//			}
//		}
//	}
//}
//
//int cmp_int(const void* e1, const void* e2)
//{
//	return *(int*)e1-*(int*)e2;
//}
//
//int main()
//{
//	int arr[] = { 3,5,6,7,2,1,10,4,9,8 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	my_qsort(arr, sz, sizeof(arr[0]), cmp_int);
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}

int cmp_int(const void* e1,const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

void exg(char* p1, char* p2,size_t size)
{
	while (size--)
	{
		char a = *p1;
		*p1 = *p2;
		*p2 = a;
		p1++;
		p2++;
	}
}

void my_bubble_qsort(void* base, size_t num, size_t size, int (*compar)(const void*, const void*))
{
	int i = 0;
	int j = 0;
	for (i = 0; i < num-1; i++)
	{
		for (j = 0; j < num-i-1; j++)
		{
			if (compar((char*)base + size * j, (char*)base + size * (j + 1)) > 0)
			{
				exg((char*)base + size * j, (char*)base + size * (j + 1),size);
			}
		}
	}
}

int main()
{
	int arr[] = { 4,2,5,8,10,3,1,9,6,7 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	my_bubble_qsort(arr, sz, sizeof(arr[0]), cmp_int);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}